/*
 *
 * NMEA library
 * URL: http://nmea.sourceforge.net
 * Author: Tim (xtimor@gmail.com)
 * Licence: http://www.gnu.org/licenses/lgpl.html
 * $Id: sentence.h 17 2008-03-11 11:56:11Z xtimor $
 *
 */

/*! \file */

#ifndef __NMEA_SENTENCE_H__
#define __NMEA_SENTENCE_H__

#include "info.h"

/**
 * Thu Jun  3 09:26:01 CST 2021, add by SYAKYOU.
 * The sentence is as follows
 * GNGSA, GBGSV, GNVTG, GNRMC, GNGGA, GNGLL
 */

#ifdef  __cplusplus
extern "C" {
#endif

/**
 * NMEA packets type which parsed and generated by library
 */
enum nmeaPACKTYPE
{
    GPNON   = 0x0000,   /**< Unknown packet type. */
    GPGGA   = 0x0001,   /**< GGA - Essential fix data which provide 3D location and accuracy data. */
    GPGSA   = 0x0002,   /**< GSA - GPS receiver operating mode, SVs used for navigation, and DOP values. */
    GPGSV   = 0x0004,   /**< GSV - Number of SVs in view, PRN numbers, elevation, azimuth & SNR values. */
    GPRMC   = 0x0008,   /**< RMC - Recommended Minimum Specific GPS/TRANSIT Data. */
    GPVTG   = 0x0010,   /**< VTG - Actual track made good and speed over ground. */
    GNGGA   = 0x0020,
    GNGSA   = 0x0040,
    GBGSV   = 0x0080,
    GNRMC   = 0x0100,
    GNVTG   = 0x0200,
    GNGLL   = 0x0400,
    GPGLL   = 0x0800,
    GPZDA   = 0x1000,
    GNZDA   = 0x2000,
};

/**
 * GGA packet information structure (Global Positioning System Fix Data)
 */
typedef struct _nmeaGGA
{
    nmeaTIME utc;       /**< UTC of position (just time) */
	double  lat;        /**< Latitude in NDEG - [degree][min].[sec/60] */
    char    ns;         /**< [N]orth or [S]outh */
	double  lon;        /**< Longitude in NDEG - [degree][min].[sec/60] */
    char    ew;         /**< [E]ast or [W]est */
    int     sig;        /**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */
	int     satinuse;   /**< Number of satellites in use (not those in view) */
    double  HDOP;       /**< Horizontal dilution of precision */
    double  elv;        /**< Antenna altitude above/below mean sea level (geoid) */
    char    elv_units;  /**< [M]eters (Antenna height unit) */
    double  diff;       /**< Geoidal separation (Diff. between WGS-84 earth ellipsoid and mean sea level. '-' = geoid is below WGS-84 ellipsoid) */
    char    diff_units; /**< [M]eters (Units of geoidal separation) */
    double  dgps_age;   /**< Time in seconds since last DGPS update */
    int     dgps_sid;   /**< DGPS station ID number */

} nmeaGGA;

/**
 * GSA packet information structure (Satellite status)
 */
typedef struct _nmeaGSA
{
    char    fix_mode;   /**< Mode (M = Manual, forced to operate in 2D or 3D; A = Automatic, 3D/2D) */
    int     fix_type;   /**< Type, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */
    int     sat_prn[NMEA_MAXSAT]; /**< PRNs of satellites used in position fix (null for unused fields) */
    double  PDOP;       /**< Dilution of precision */
    double  HDOP;       /**< Horizontal dilution of precision */
    double  VDOP;       /**< Vertical dilution of precision */

} nmeaGSA;

/**
 * GSV packet information structure (Satellites in view)
 */
typedef struct _nmeaGSV
{
    int     pack_count; /**< Total number of messages of this type in this cycle */
    int     pack_index; /**< Message number */
    int     sat_count;  /**< Total number of satellites in view */
    nmeaSATELLITE sat_data[NMEA_SATINPACK];

} nmeaGSV;

/**
 * RMC packet information structure (Recommended Minimum sentence C)
 */
typedef struct _nmeaRMC
{
    nmeaTIME utc;       /**< UTC of position */
    char    status;     /**< Status (A = active or V = void) */
	double  lat;        /**< Latitude in NDEG - [degree][min].[sec/60] */
    char    ns;         /**< [N]orth or [S]outh */
	double  lon;        /**< Longitude in NDEG - [degree][min].[sec/60] */
    char    ew;         /**< [E]ast or [W]est */
    double  speed;      /**< Speed over the ground in knots */
    double  direction;  /**< Track angle in degrees True */
    double  declination; /**< Magnetic variation degrees (Easterly var. subtracts from true course) */
    char    declin_ew;  /**< [E]ast or [W]est */
    char    mode;       /**< Mode indicator of fix type (A = autonomous, D = differential, E = estimated, N = not valid, S = simulator) */

} nmeaRMC;

/**
 * VTG packet information structure (Track made good and ground speed)
 */
typedef struct _nmeaVTG
{
    double  dir;        /**< True track made good (degrees) */
    char    dir_t;      /**< Fixed text 'T' indicates that track made good is relative to true north */
    double  dec;        /**< Magnetic track made good */
    char    dec_m;      /**< Fixed text 'M' */
    double  spn;        /**< Ground speed, knots */
    char    spn_n;      /**< Fixed text 'N' indicates that speed over ground is in knots */
    double  spk;        /**< Ground speed, kilometers per hour */
    char    spk_k;      /**< Fixed text 'K' indicates that speed over ground is in kilometers/hour */

} nmeaVTG;

void nmea_zero_GGA(nmeaGGA *pack);
void nmea_zero_GSA(nmeaGSA *pack);
void nmea_zero_GSV(nmeaGSV *pack);
void nmea_zero_RMC(nmeaRMC *pack);
void nmea_zero_VTG(nmeaVTG *pack);

/************************************************************************/
/* GLL packet information structure (Geographic position, latitude, longitude) */
/************************************************************************/
typedef struct _nmeaGLL
{
  double  lat;        /**< Latitude in NDEG - [degree][min].[sec/60] */
  char    ns;         /**< [N]orth or [S]outh */
  double  lon;        /**< Longitude in NDEG - [degree][min].[sec/60] */
  char    ew;         /**< [E]ast or [W]est */
  nmeaTIME utc;       /**< UTC of position */
  char    status;     /**< Status (A = active or V = void) */
  char    mode;       /**< Mode indicator of fix type (A = autonomous, D = differential, E = estimated, N = not valid, S = simulator) */
} nmeaGLL;

void nmea_zero_GLL(nmeaGLL *pack);

typedef struct _nmeaZDA 
{
  nmeaTIME utc;
  int local_time_hours;
  int local_time_min;
} nmeaZDA;

void nmea_zero_ZDA(nmeaZDA *pack);

#ifdef  __cplusplus
}
#endif

#endif /* __NMEA_SENTENCE_H__ */
